#include "Acceptor.h"

Acceptor::Acceptor(EventLoop *loop, const std::string &ip, const uint16_t& port)
:loop_(loop),servsock_(createnonblocking()),acceptchannel_(loop_, servsock_.fd())
{
    // servsock_ = new Socket(createnonblocking());
    InetAddress serveraddr(ip, port);
    servsock_.setkeepalive(true);
    servsock_.setreuseaddr(true);
    servsock_.setreuseport(true);
    servsock_.settcpnodelay(true);
    servsock_.bind(serveraddr); 
    servsock_.listen();
    std::vector<epoll_event> evs;

    // int epfd = epoll_create(1);
    // Epoll epoll;
    // acceptchannel_ = new Channel(loop_, servsock_->fd());
    // 这里为什么是this
    acceptchannel_.setreadcallback(std::bind(&Acceptor::newConnection,this));
    acceptchannel_.enablereading();
    acceptchannel_.setinepoll();
}

Acceptor::~Acceptor()
{
    delete servsock_;
    delete acceptchannel_;
}

void Acceptor::setnewConnectioncb(func_t func)
{
    newConnectioncb_ = func;
}

void Acceptor::newConnection()
{
    ////////////////////////////////////////////////////////////////////////
    InetAddress clientaddr; // 客户端的地址和协议。
    // 注意，clientsock只能new出来，不能在栈上，否则析构函数会关闭fd。
    // 还有，这里new出来的对象没有释放，这个问题以后再解决。
    Socket *clientsock = new Socket(servsock_->accept(clientaddr));
    clientsock->setipport(clientaddr.ip(),clientaddr.port());
    

    // // 为新客户端连接准备读事件，并添加到epoll中。
    // Channel *clientchannel = new Channel(epfd_, clientsock->fd()); // 这里new出来的对象没有释放，这个问题以后再解决。
    // // 找到bug了这是是servchannel
    // clientchannel->setreadcallback(std::bind(&Channel::onmessage,clientchannel)) ; 
    // clientchannel->useet();                                               // 客户端连上来的fd采用边缘触发。
    // clientchannel->enablereading();   
    //                                   // 让epoll_wait()监视clientchannel的读事件。
    //                                                                  ////////////////////////////////////////////////////////////////////////

    newConnectioncb_(clientsock);
}